package com.pkk.penguin.frame.know.java.interview.iadd;

import org.junit.Test;

/**
 * @description: i++的问题讲解
 * @author: peikunkun
 * @create: 2019-12-28 16:05
 **/
public class IAddInterview {

  @Test
  public void kunzai_11_20191228160609() {
    System.out.println("欢迎使用单元测试方法【kunzai_11()_20191228160609】");
    System.out.println("此方法测试描述：【总的来说涉及的是局部变量表和操作数栈,i++和++i的区别是,i++是先引用在++(也就是进操作数栈,在进行加加操作),++i是先加加在引用(先在局部变量表中加加,然后在取值到操作数栈中)】");
    System.out.println("总结:");
    System.out.println("1.=右边的运算,从左到右加载值依次压入操作数栈,不区分运算符优先级");
    System.out.println("2.到时候实际先算哪一个根据优先级");
    System.out.println("3.自增自减不经过操作数栈,直接操作局部变量表");
    System.out.println("4.最后的赋值运算之前,生成的临时变量也是压入操作数栈");
    System.out.println("5.运算在操作数栈中进行运算");
    //i进行入栈操作,在操作数栈中操作为1,然后赋值给i(局部变量表),此时i为1
    int i = 1;
    //i此时是1,然后进行入栈操作,在栈中i值为1,局部变量表中的i进行++操作,此时栈中的i是1,局部变量表的i是2
    i++;
    //取局部变量表的i值为2进行压栈操作,入栈iTemp1值2,局部变量表的i在进行++操作,iTemp为2,出栈赋值给局部变量表的j,j此时值为2,局部变量表的i值为3(i++是先出栈然后再在局部变量表中进行加加)
    int j = i++;
    //局部变量表的i为3,++操作直接操作局部变量表i值为4,
    ++i;
    //j值为2,先加加j值为3,压栈操作栈内jTemp1为3,出栈赋值给a,a值为3
    int a = ++j;
    //i先压栈操作,栈内iTemp1为4,i++操作,i先入压栈操作,局部变量表i值为4,栈内iTemp2为4,加加操作直接操作局部变量表i,值为5,++i操作,先加加,直接操作局部变量表i值为6,入栈操作栈内iTemp3值为6
    //运算:先乘除后加减,b也就=(iTemp1+iTemp2*iTemp3)=(iTemp1+(iTemp2*iTemp3))=(4+(4*6))
    int b = i + i++ * ++i;
    System.out.println(i);//6
    System.out.println(j);//3
    System.out.println(a);//3
    System.out.println(b);//28
  }

}
